#ifndef __SIGNAL__LINUX
#define __SIGNAL__LINUX

#include <signal.h>
#include <sys/types.h>
#include <vector>
#include <algorithm>
#include <unistd.h>
#include <cstdint>
#include "../bit_and_attribute.h"
/* 同时有守护进程记录 所有子系统的操作 日志,方便排查错误  */
// 使用系统日志 记录守护进程的所有操作
//获取初始complete的信号的值
//
#define COMPLETE_INDEX 0x1234
enum SIGNAL_OPT{                            //常规的信号操作的枚举
    EMPTY=0x0,
    FILLSET=0x1,
    ADD=0x2,
    DEL=0x3,
    ISMEMBER=0x4,
    PROCMASK=0x5
};

/* C++ 也有相应的信号的类,但是指针对的是 Linux的信号操作,不需要跨平台,还是使用传统的Linux 信号通知 自己进行封装 */
struct sig_sub_bit{
    uint8_t sid;        //TODO:signal index for shell using
    uint8_t cmd[128];   //TODO: 需要和csv的 id 保持一致
                        //FIXME:分配检测机制需要继续测试 
}__packed;

static uint32_t sig_bit_mask[8]={0}; //TODO:在signal bit mask中代表分配的256个index的值

class Signal{
public:
    typedef void (*sigfunc)(int _sig);                                                  //常规的函数声明
    Signal(){}
    Signal(sigset_t* _sig);
    void operator()(sigset_t* _sig);
    void operator=(sigset_t* _sig);
    void sig_init();                                                                    //一般性质的信号初始化
    void sig_opt(std::vector<std::pair<SIGNAL_OPT,sigset_t>> _sig);                     //对信号的集合操作,可以对信号进行批量操作
    void snd_sig(int sig);                                                              //使用kill 发送信号
    void update_sig_func(sigfunc* _sig);                                                 //改变默认的信号的函数
    void pedding_sig(sigset_t* _sig);                                       //要检测的信号集合,在try catch中进行异常处理
    bool pedding_proc(pid_t pid);                                           //检测进程是否存在
    ~Signal();    
private:
    sigset_t* sig;                                                          //sig 信号集合
    int sig_mask; // 
};

#endif /* __SIGNAL_LINUX */
